package com.vehiclesecure.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.index.Indexed;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 车辆信息表实体类
 * 包含VIN码和车牌号作为车辆唯一标识
 * 实现与用户的绑定功能
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "vehicles")
public class Vehicle {
    @Id
    private String id;
    
    @Indexed(unique = true)
    private String vin;                    // VIN码（车辆识别号码）
    
    @Indexed(unique = true)
    private String licensePlate;          // 车牌号
    
    private String brand;                 // 品牌（如：丰田、宝马、奥迪等）
    private String model;                 // 车型（如：凯美瑞、X5、A6等）
    private String color;                 // 车身颜色
    private Integer year;                // 生产年份
    private String fuelType;              // 燃料类型（汽油、柴油、电动、混动）
    private String transmissionType;      // 变速箱类型（手动、自动、CVT）
    private Double engineCapacity;        // 发动机排量（升）
    private String vehicleType;           // 车辆类型（轿车、SUV、MPV、跑车等）
    
    private String ownerId;               // 车主用户ID（外键关联User）
    private String ownerName;             // 车主姓名
    private String ownerPhone;            // 车主联系电话
    private String ownerEmail;            // 车主邮箱
    
    private LocalDateTime registrationDate; // 车辆注册日期
    private LocalDateTime insuranceExpiry;  // 保险到期日期
    private LocalDateTime lastMaintenance;  // 上次保养日期
    private LocalDateTime nextMaintenanceDate; // 下次保养日期
    private Integer mileage;               // 当前里程数（公里）
    
    private String deviceId;              // 关联的车载设备ID
    private String deviceSerialNumber;    // 设备序列号
    private String deviceModel;           // 设备型号
    private String deviceVersion;         // 设备固件版本
    
    private Boolean isActive;             // 车辆是否激活
    private Boolean isStolen;             // 是否被盗标记
    private String status;                // 车辆状态（ACTIVE、INACTIVE、MAINTENANCE、STOLEN）
    
    private List<String> authorizedUsers; // 授权用户ID列表（允许多人访问）
    private List<String> tags;            // 车辆标签（用于分类管理）
    
    private String notes;                 // 备注信息
    private LocalDateTime createdAt;      // 创建时间
    private LocalDateTime updatedAt;      // 更新时间
    
    // 车辆照片URL
    private String frontImageUrl;         // 前脸照片
    private String sideImageUrl;          // 侧面照片
    private String rearImageUrl;          // 尾部照片
    private String interiorImageUrl;      // 内饰照片
    
    // 车辆证件信息
    private String registrationNumber;    // 行驶证号
    private String registrationCertificateUrl; // 行驶证照片URL
    private String insurancePolicyNumber; // 保险单号
    private String insuranceCertificateUrl; // 保险凭证URL
    
    // GPS最后位置
    private Double lastLatitude;          // 最后已知纬度
    private Double lastLongitude;         // 最后已知经度
    private LocalDateTime lastLocationUpdate; // 最后位置更新时间
    
    // 车辆配置信息
    private Boolean hasGPS;              // 是否配备GPS
    private Boolean hasAlarm;            // 是否配备报警器
    private Boolean hasImmobilizer;      // 是否配备防盗器
    private Boolean hasCamera;           // 是否配备摄像头
    
    public enum Status {
        ACTIVE,      // 正常激活
        INACTIVE,    // 未激活
        MAINTENANCE, // 维修保养中
        STOLEN,      // 被盗
        SOLD,        // 已出售
        SCRAPPED     // 已报废
    }
    
    public enum FuelType {
        GASOLINE,    // 汽油
        DIESEL,      // 柴油
        ELECTRIC,    // 电动
        HYBRID,      // 混动
        LPG,         // 液化石油气
        CNG          // 压缩天然气
    }
    
    public enum TransmissionType {
        MANUAL,      // 手动
        AUTOMATIC,   // 自动
        CVT,         // 无级变速
        DCT,         // 双离合
        AMT          // 机械式自动
    }
    
    public enum VehicleType {
        SEDAN,       // 轿车
        SUV,         // SUV
        MPV,         // MPV
        HATCHBACK,   // 两厢车
        COUPE,       // 跑车
        PICKUP,      // 皮卡
        VAN,         // 厢式货车
        BUS,         // 客车
        TRUCK        // 卡车
    }
}